
/**
 * 检查是否超出BPMN元素数量限制
 * @param parent 父元素
 * @param newElement 新增元素
 * @returns 是否允许添加
 */

// 定义每个流程允许的特定元素的最大数量
export const BPMN_ELEMENT_LIMITS = {
  'bpmn:StartEvent': 1,   // 只能有1个开始事件
  'bpmn:EndEvent': 1,      // 最多1个结束事件
//   'bpmn:ExclusiveGateway': 5 // 最多5个排他网关
};
export const checkBpmnElementLimit = (parent: any, newElement: any) => {
  const elementType = newElement.type;
  
  // 如果该类型没有限制，直接允许
  if (!BPMN_ELEMENT_LIMITS[elementType]) return true;

  // 计算当前已存在的该类型元素数量
  const currentCount = parent.children.filter(
    (el: any) => el.type === elementType
  ).length;

  // 如果是新增操作，需要+1
  const willHaveCount = currentCount + 1;

  return willHaveCount <= BPMN_ELEMENT_LIMITS[elementType];
};


// 高级验证规则
const BPMN_VALIDATION_RULES = [
  {
    // 开始事件只能有1个
    type: 'bpmn:StartEvent',
    validator: (parent: any, newElement: any) => {
      const count = parent.children.filter(
        (el: any) => el.type === 'bpmn:StartEvent'
      ).length;
      return count < 1;
    },
    message: '每个流程只能有1个开始事件'
  },
  {
    // 不能同时存在并行网关和事件网关
    validator: (parent: any, newElement: any) => {
      const hasParallel = parent.children.some(
        (el: any) => el.type === 'bpmn:ParallelGateway'
      );
      const hasEvent = parent.children.some(
        (el: any) => el.type === 'bpmn:EventBasedGateway'
      );
      return !(hasParallel && hasEvent);
    },
    message: '不能同时使用并行网关和事件网关'
  }
];
export const advancedValidation=(parent: any, newElement: any)=> {
  for (const rule of BPMN_VALIDATION_RULES) {
    // 如果规则指定了type且不匹配当前元素，则跳过
    if (rule.type && rule.type !== newElement.type) continue;
    
    if (!rule.validator(parent, newElement)) {
      return { valid: false, message: rule.message };
    }
  }
  return { valid: true };
}

